home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Enigma Amiga CD
/
Listati
/
66-Lug-Ago-DIDATTICA-List2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-02
|
11KB
|
254 lines
/****************************************************************************
* Listato 2 *
* Apre una finestra e inserisce una serie di gadget d'esempio *
****************************************************************************/
#define INTUI_V36_NAMES_ONLY
/* inclusione file di supporto */
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <graphics/gfx.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/layers_protos.h>
#include <clib/dos_protos.h>
struct Library *IntuitionBase = NULL; /* puntatore a intuition.library */
struct Library *GfxBase = NULL; /* puntatore a graphics.library */
struct Screen *pubscreen = NULL; /* puntatore al workbench */
struct Window *finestra = NULL; /* puntatore alla finestra */
struct MsgPort *UPort; /* puntatore alla porta IDCMP */
UBYTE *ChipMem = NULL; /* puntatore alla chip ram per le immagini */
/* definizione codici identificatori dei gagdets */
#define GADG_1 0
#define GADG_2 1
#define GADG_3 2
#define GADG_4 3
#define GADG_5 4
/* utilizza font topaz 8 */
struct TextAttr font = { "topaz",8,FS_NORMAL,FPF_ROMFONT };
/* dati per le immagini del gadget */
UWORD imagedata1[] =
{
0xFFFE,0xC000,0xC000,0xC000,0xC000,0xC000,0xC000,0x8000,
0x0001,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x7FFF
};
UWORD imagedata2[] =
{
0x0001,0x3FFF,0x3FFF,0x3FFF,0x3FFF,0x3FFF,0x3FFF,0x7FFF,
0xFFFE,0xFFFC,0xFFFC,0xFFFC,0xFFFC,0xFFFC,0xFFFC,0x8000
};
/* immagini per i gadget
struct Image
{
WORD LeftEdge; posizione dell'immagine relativa all'elemento a cui e' collegata
WORD TopEdge;
WORD Width; grandezza dell'immagine
WORD Height;
WORD Depth;
UWORD *ImageData; puntatore ai dati dell'immagine
UBYTE PlanePick; indica su quali bitplanes (bit 0 = bitplane 0, bit 1 = bitplane 1)
dello schermo piazzare i bitplane (dove i bit sono a 1) dell'immagine;
esempio con immagine a due bitplane:
sui primi due bitplane 0x3 (in binario 00000011),
sul terzo e quarto 0xC (in binario 00001100)
UBYTE PlaneOnOff; indica come impostare i bitplanes dello schermo non influenzati
dall'immagine (quelli in cui i bit corrispondenti di PlanePick sono a 0;
esempi di prima:
0xFF, imposta tutti i pixel dei bitplanes non influenzati
dall'immagine a 1 (vale a dire 2,3,4,5,6,7 nel primo caso
e 0,1,4,5,6,7 nel secondo)
0xF0, imposta i pixel dei bitplanes 4-7 che non sono influen-
zati dall'immagine con 1 e i pixel dei bitplanes 0-3 non
influenzati dall'immagine a 0
struct Image *NextImage;
};
i dati dell'immagine devono essere memorizzati in WORD della memoria chip; se
il Width dell'immagine non e' allineato a WORD (multiplo di 16) bisogna memoriz-
zare i dati dell'immagine come se lo fosse approssimando quando occorre per eccesso;
i dati vengono memorizzati per bitplane partendo da quello piu' basso (0, 1 ecc.)
E' possibile collegare una serie di immagini in cascata (verranno visualizzate insieme)
mediante NextImage;
*/
struct Image PropImm1;
struct Image Imm2 = { 0,0,16,8,2,NULL,0x3,0,NULL };
struct Image Imm1 = { 0,0,16,8,2,NULL,0x3,0,NULL };
/* strutture dei bordi per i gadget
struct Border
{
WORD LeftEdge,TopEdge; posizione del bordo relativa all'elemento collegato
UBYTE FrontPen,BackPen; penne di scrittura e di sfondo
UBYTE DrawMode; modalita' di disegno: JAM1 normale,
COMPLEMENT si disegna realizzando il complemento bit
a bit dello sfondo
BYTE Count; numero di punti della polilinea del bordo
WORD *XY; cordinate dei punti della polilinea; es:
WORD Linea[] = { x1,y1,x2,y2,x3,y3, ... };
Si disegnera' la linea a partire da (x1,y1) per
(x2,y2), poi da (x2,y2) a (x3,y3) e cosi' via
struct Border *NextBorder;
};
Piu' bordi possono essere collegati con NextBorder (verranno disegnato insieme)
*/
WORD Data4[] = { 201,9,201,-2,200,-1,200,9,-1,9 };
WORD Data3[] = { -2,-2,-2,9,-1,9,-1,-2,201,-2 };
struct Border Bord6 = { 0,0,2,0,JAM1,5,Data4,NULL };
struct Border Bord5 = { 0,0,1,0,JAM1,5,Data3,&Bord6 };
WORD Data2[] = { 359,11,359,0,358,1,358,11,1,11 };
WORD Data1[] = { 0,0,0,11,1,11,1,0,359,0 };
struct Border Bord4 = { 0,0,2,0,JAM1,5,Data2,NULL };
struct Border Bord3 = { 0,0,1,0,JAM1,5,Data1,&Bord4 };
struct Border Bord2 = { 0,0,1,0,JAM1,5,Data2,NULL };
struct Border Bord1 = { 0,0,2,0,JAM1,5,Data1,&Bord2 };
/* strutture dei gadget
struttura di IntuiText, per i testi su intuition:
struct IntuiText
{
UBYTE FrontPen,BackPen; penne di scrittura e di sfondo
UBYTE DrawMode; JAM1 scrivi il testo ma lascia inalterato lo sfondo
JAM2 scrivi il testo e riscrivi lo sfondo con BackPen
COMPLEMENT scrivi il testo con il complemento bit a bit con lo sfondo
WORD LeftEdge,TopEdge; posizione del testo (angolo in alto a sinistra)
relativa all'elemento collegato
struct TextAttr *ITextFont; font del testo
UBYTE *IText; puntatore al testo
struct IntuiText *NextText; puntatore alla prossima struttura IntuiText
}
Piu' testi possono essere collegati con NextText (verranno visualizzati insieme)
*/
char Buffer[101];
struct StringInfo String1 = { Buffer,NULL,0,100,0,0,0,0,0,0,NULL,0,NULL };
struct IntuiText Text5 = { 1,0,JAM2,-150,0,&font,"Inserisci un testo",NULL };
struct Gadget Gad5 = { NULL,160,76,200,12,GFLG_GADGHNONE,
GACT_RELVERIFY,GTYP_STRGADGET,(APTR)&Bord5,NULL,
&Text5,0,&String1,GADG_5,NULL };
struct PropInfo Prop1 = { AUTOKNOB|FREEHORIZ|PROPNEWLOOK,0,0,MAXBODY/256,MAXBODY,0,0,0,0,0,0 };
struct IntuiText Text4 = { 1,0,JAM2,310,2,&font,"Rosso",NULL };
struct Gadget Gad4 = { &Gad5,10,60,300,12,0,
GACT_RELVERIFY,GTYP_PROPGADGET,(APTR)&PropImm1,NULL,
&Text4,0,&Prop1,GADG_4,NULL };
struct IntuiText Text3 = { 1,0,JAM2,20,0,&font,"Gadget con immagine e highlight con immagine",NULL };
struct Gadget Gad3 = { &Gad4,10,48,16,8,GFLG_GADGIMAGE|GFLG_GADGHIMAGE|GFLG_GADGHCOMP,
GACT_RELVERIFY,GTYP_BOOLGADGET,(APTR)&Imm1,(APTR)&Imm2,
&Text3,0,NULL,GADG_3,NULL };
struct IntuiText Text2 = { 1,0,JAM2,4,2,&font,"Gadget con bordo e highlight con bordo",NULL };
struct Gadget Gad2 = { &Gad3,10,34,360,12,GFLG_GADGHIMAGE,
GACT_RELVERIFY,GTYP_BOOLGADGET,(APTR)&Bord1,(APTR)&Bord3,
&Text2,0,NULL,GADG_2,NULL };
struct IntuiText Text1 = { 1,0,JAM2,4,2,&font,"Gadget con bordo e highlight con complemento",NULL };
struct Gadget Gad1 = { &Gad2,10,20,360,12,GFLG_GADGHCOMP,
GACT_RELVERIFY,GTYP_BOOLGADGET,(APTR)&Bord1,NULL,
&Text1,0,NULL,GADG_1,NULL };
/* definizione prototipi di funzione */
void WaitEvent(struct MsgPort *,struct IntuiMessage *);
void CloseAll(void);
void OpenAll(void);
void WaitEvent(struct MsgPort *porta,struct IntuiMessage *mess)
{
struct IntuiMessage *msg;
while ((msg = (struct IntuiMessage *)GetMsg(porta)) == NULL)
WaitPort(porta);
CopyMem(msg,mess,sizeof(struct IntuiMessage));
return;
}
/* procedura CloseAll() */
void CloseAll()
{
if (finestra != NULL) CloseWindow(finestra);
if (ChipMem != NULL) FreeMem(ChipMem,100);
if (pubscreen != NULL) UnlockPubScreen(NULL,pubscreen);
if (GfxBase != NULL) CloseLibrary(GfxBase);
if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
exit(0);
}
/* procedura OpenAll() */
void OpenAll()
{
/* apriamo intuition.library, almeno version 36 */
if ((IntuitionBase = OpenLibrary("intuition.library",36L)) == NULL)
CloseAll();
/* apriamo graphics.library, almeno version 36; vengono utilizzate delle
funzioni per il disegno */
if ((GfxBase = OpenLibrary("graphics.library",36L)) == NULL)
CloseAll();
/* blocca lo schermo pubblico di default */
if ((pubscreen = LockPubScreen(NULL)) == NULL)
CloseAll();
/* allochiamo chip memory per le immagini bitmap dei gadget */
if ((ChipMem = AllocMem(100,MEMF_CHIP|MEMF_CLEAR|MEMF_PUBLIC)) == NULL)
CloseAll();
/* copiamo i dati delle immagini nella chip ram allocata e inseriamo i puntatori
nei relativi campi di Image */
CopyMem(imagedata1,ChipMem,32); Imm1.ImageData = (UWORD *)ChipMem;
CopyMem(imagedata2,ChipMem+32,32); Imm2.ImageData = (UWORD *)(ChipMem+32);
/* scrive il testo di base del gadget stringa */
strcpy(Buffer,"Testo");
/* apre finestra spostabile, ridimensionabile, SuperBitMap, GimmeZeroZero,
con il gadget di chiusura */
if ((finestra = OpenWindowTags(NULL,WA_Left,10,
WA_Top,10,
WA_Width,390,
WA_Height,100,
WA_Title,"Esempi di gadgets",
WA_DragBar,TRUE,
WA_CloseGadget,TRUE,
WA_DepthGadget,TRUE,
WA_Flags,WFLG_NOCAREREFRESH,
WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_GADGETDOWN|IDCMP_GADGETUP,
WA_Gadgets,&Gad1,
WA_PubScreen,pubscreen,
TAG_END)) == NULL)
CloseAll();
UPort = finestra -> UserPort;
return;
}
void main()
{
register UWORD GadID;
struct IntuiMessage mm;
OpenAll(); /* apre tutte le strutture dati */
while(1)
{
WaitEvent(UPort,&mm); /* attende un evento */
if (mm.Class == IDCMP_CLOSEWINDOW) break; /* se gadget di chiusura esci */
else if (mm.Class == IDCMP_GADGETDOWN)
{
GadID = ((struct Gadget *)(mm.IAddress))->GadgetID;
}
else if (mm.Class == IDCMP_GADGETUP)
{
GadID = ((struct Gadget *)(mm.IAddress))->GadgetID;
}
}
CloseAll(); /* chiudi tutto ed esci */
}